home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / bbs_util / bsrc_260.zip / SRC.ZIP / BTCONFIG.C < prev    next >
C/C++ Source or Header  |  1996-04-07  |  36KB  |  1,574 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      ------------         Bit-Bucket Software, Co.                       */
  5. /*      \ 10001101 /         Writers and Distributors of                    */
  6. /*       \ 011110 /          Freely Available<tm> Software.                 */
  7. /*        \ 1011 /                                                          */
  8. /*         ------                                                           */
  9. /*                                                                          */
  10. /*              (C) Copyright 1987-96, Bit Bucket Software Co.              */
  11. /*                                                                          */
  12. /*                This module was written by Vince Perriello                */
  13. /*                                                                          */
  14. /*                   BinkleyTerm Configuration File Parser                  */
  15. /*                                                                          */
  16. /*                                                                          */
  17. /*    For complete  details  of the licensing restrictions, please refer    */
  18. /*    to the License  agreement,  which  is published in its entirety in    */
  19. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.260.    */
  20. /*                                                                          */
  21. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  22. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  23. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  24. /*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
  25. /*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
  26. /*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
  27. /*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
  28. /*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
  29. /*                                                                          */
  30. /*                                                                          */
  31. /* You can contact Bit Bucket Software Co. at any one of the following      */
  32. /* addresses:                                                               */
  33. /*                                                                          */
  34. /* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
  35. /* P.O. Box 460398                AlterNet 7:42/1491                        */
  36. /* Aurora, CO 80046               BBS-Net  86:2030/1                        */
  37. /*                                Internet f491.n343.z1.fidonet.org         */
  38. /*                                                                          */
  39. /* Please feel free to contact us at any time to share your comments about  */
  40. /* our software and/or licensing policies.                                  */
  41. /*                                                                          */
  42. /*--------------------------------------------------------------------------*/
  43.  
  44. /* Include this file before any other includes or defines! */
  45.  
  46. #include "includes.h"
  47.  
  48. char *ctl_slash_string (char *);
  49. static word Zone = 1;
  50.  
  51. void cfg_macro (char *);
  52. void cfg_dial_string (char *);
  53. void cfg_alt_num (char *);
  54. void cfg_mdm_trans (char *);
  55. void cfg_domain (char *);
  56. void cfg_Janus (char *);
  57. void cfg_domain_kludge (char *);
  58.  
  59. #ifdef BINKLEY_SOUNDS
  60. char *cfg_sound (char *);
  61. #endif
  62.  
  63. void
  64. parse_config (char *config_file)
  65. {
  66.     FILE *stream;
  67.     char temp[256];
  68.     char *c;
  69.     int i;
  70.     long ltemp;
  71.     char *p;
  72.     ADDR temp_addr;                /* Used to get address */
  73.  
  74.     (void) sprintf (temp, "%s%s", BINKpath, config_file);
  75.     if ((stream = share_fopen (temp, read_ascii, DENY_WRITE)) == NULL)    /* OK, let's open the file   */
  76.         return;                    /* no file, no work to do    */
  77.  
  78.     while ((fgets (temp, 255, stream)) != NULL)    /* Now we parse the file ... */
  79.     {
  80.         c = temp;                /* Check out the first char  */
  81.         if ((*c == '%') || (*c == ';'))    /* See if it's a comment
  82.                                                   * line */
  83.             continue;
  84.  
  85.         i = (int) strlen (temp);/* how long this line is     */
  86.  
  87.         if (i < 3)
  88.             continue;            /* If too short, ignore it   */
  89.  
  90.         c = &temp[--i];            /* point at last character   */
  91.         if (*c == '\n')            /* if it's a newline,        */
  92.             *c = '\0';            /* strip it off              */
  93.  
  94.         if ((i = parse (temp, config_lines)) != 0)
  95.         {
  96.             c = &temp[(config_lines[i - 1]).p_length];
  97.         }
  98.  
  99.         switch (i)
  100.         {
  101.         case 1:                    /* "SameRing"      */
  102.             /* This modem doesn't differentiate
  103.                between RING and RINGING */
  104.  
  105.             def_mdm_resps[2].disp = IGNORE;
  106.             break;
  107.  
  108.         case 2:                    /* "NewNodeList"   */
  109.         case 129:                /* "Version6"      */
  110.             newnodelist = 1;
  111.             break;
  112.  
  113.         case 3:                    /* "QuickNodeList" */
  114. #ifdef QUICK_LIST
  115.             nodefunc = QuickLookup;
  116.             newnodelist = 0;
  117. #endif
  118.             break;
  119.  
  120.         case 4:                    /* "Answerback"    */
  121.             answerback = ctl_string (c);
  122.             break;
  123.  
  124.         case 5:                    /* "Macro"         */
  125.             cfg_macro (c);
  126.             break;
  127.  
  128.         case 6:                    /* "Shell"         */
  129.             c = skip_blanks (c);
  130.             i = atoi (c);
  131.             if ((i <= 0) || (i > 9))
  132.             {
  133.                 (void) printf ("%s %d %s\n", MSG_TXT (M_SHELL_NUMBER), i, MSG_TXT (M_OUT_OF_RANGE));
  134.                 break;
  135.             }
  136.             c = skip_to_blank (c);
  137.             c = skip_blanks (c);
  138.             shells[i - 1] = calloc (1, strlen (c) + 1);
  139.             (void) strcpy (shells[i - 1], c);
  140.             (void) strupr (shells[i - 1]);
  141.             break;
  142.  
  143.         case 7:                    /* "Dial"          */
  144.             cfg_dial_string (c);
  145.             break;
  146.  
  147.         case 8:                    /* "Event"         */
  148.             c = skip_blanks (c);
  149.             (void) parse_event (c);
  150.             break;
  151.  
  152.         case 9:                    /* "Zone"          */
  153.             c = skip_blanks (c);
  154.             Zone = (word) atoi (c);
  155.             if (!Zone)            /* if we didn't find a zone  */
  156.                 (void) printf (MSG_TXT (M_ILLEGAL_ZONE), &temp[4]);
  157.             break;
  158.  
  159.         case 10:                /* "MaxReq"        */
  160.             (void) sscanf (c, "%d %d", &DEFAULT.rq_Limit, &DEFAULT.rq_Cum_Limit);
  161.             if (!DEFAULT.rq_Limit)    /* No requests??? */
  162.                 (void) printf ("0 %s\n", MSG_TXT (M_REQUESTS_ALLOWED));
  163.             break;
  164.  
  165.         case 11:                /* "LogLevel"      */
  166.             c = skip_blanks (c);
  167.             i = atoi (c);
  168.             if ((i <= 5) && (i > 0))
  169.             {
  170.                 loglevel = i;
  171.             }
  172.             else
  173.             {
  174.                 (void) printf (MSG_TXT (M_BAD_LOGLEVEL), &temp[8]);
  175.             }
  176.             break;
  177.  
  178.         case 12:                /* "Baud"          */
  179.             ltemp = atol (c);
  180.             max_baud.rate_value = 0;
  181.             for (i = 0; pbtypes[i].rate_value; i++)
  182.             {
  183.                 if (pbtypes[i].rate_value == (unsigned long)ltemp)
  184.                 {
  185.                     max_baud.rate_mask = pbtypes[i].rate_mask;
  186.                     max_baud.rate_value = ltemp;
  187.                     break;
  188.                 }
  189.             }
  190.             if (!max_baud.rate_value)
  191.                 goto bad_line;
  192.             break;
  193.  
  194.         case 13:                /* "MaxPort"       */
  195.             c = skip_blanks (c);
  196.             i = atoi (c);                /* make it binary  */
  197.             if ((i > 0) && (i < 33))    /* if range is reasonable,   */
  198.                 MAXport = i;            /* Make it the max value     */
  199.             else
  200.                 (void) printf (MSG_TXT (M_BAD_MAXPORT), &temp[7]);
  201.             break;
  202.  
  203.         case 14:                /* "Port"         */
  204.             c = skip_blanks (c);
  205.             i = atoi (c);                /* make it binary            */
  206.             if ((i > 0) || (i < 33))    /* see if it's OK            */
  207.             {
  208.                 port_ptr = i - 1;        /* store it if so            */
  209.                 if (MAXport < i)        /* See if MAXport is less    */
  210.                     MAXport = i;        /* If so, increase MAXport   */
  211.                 original_port = port_ptr;
  212.             }
  213.             else
  214.                 (void) printf (MSG_TXT (M_ILLEGAL_PORT), &temp[4]);
  215.             break;
  216.  
  217.         case 15:                /* "Carrier"      */
  218.             c = skip_blanks (c);
  219.             i = 0;
  220.             (void) sscanf (c, "%x", &i);/* convert it to binary      */
  221.             if (i != 0)                    /* if we got anything        */
  222.                 carrier_mask = (unsigned int) i;
  223.             else
  224.                 (void) printf (MSG_TXT (M_ILLEGAL_CARRIER), &temp[7]);
  225.             break;
  226.  
  227.         case 16:                /* "StatusLog"    */
  228.             log_name = ctl_string (c);
  229.             if ((status_log = share_fopen (log_name, append_ascii, DENY_WRITE)) == NULL)
  230.             {
  231.                 free (log_name);
  232.                 log_name = NULL;
  233.             }
  234.             else
  235.             {
  236.                 (void) fprintf (status_log, "\n");
  237.                 (void) fflush (status_log);
  238.                 (void) real_flush (fileno (status_log));
  239.             }
  240.             break;
  241.  
  242.         case 17:                /* "Reader"       */
  243.             BBSreader = ctl_string (c);
  244.             break;
  245.  
  246.         case 18:                /* "BossPhone"    */
  247.             BOSSphone = ctl_string (c);
  248.             break;
  249.  
  250.         case 19:                /* "BossPwd"      */
  251.             BOSSpwd = ctl_string (c);
  252.             break;
  253.  
  254.         case 20:                /* "Protocol"     */
  255.             if (extern_index == 5)
  256.                 break;
  257.             protocols[extern_index++] = ctl_string (c);
  258.             break;
  259.  
  260.         case 21:                /* "System"       */
  261.             system_name = ctl_string (c);
  262.             break;
  263.  
  264.         case 22:                /* "Sysop"        */
  265.             sysop = ctl_string (c);
  266.             break;
  267.  
  268.         case 23:                /* "Boss"         */
  269.             c = skip_blanks (c);
  270.             (void) parse_address (c, &boss_addr);
  271.             break;
  272.  
  273.         case 24:                /* "Point"        */
  274.         case 25:                /* "Aka"          */
  275.         case 94:                /* "Address"      */
  276.             c = skip_blanks (c);
  277.             if (num_addrs == 0)
  278.                 alias[0].Zone = Zone;
  279.             (void) parse_address (c, &temp_addr);
  280.             alias[num_addrs] = temp_addr;
  281.             Zone = alias[0].Zone;    /* First is real default */
  282.             ++num_addrs;
  283.             break;
  284.  
  285.         case 26:                /* "Hold"         */
  286.             hold_area = ctl_slash_string (c);
  287.             if (hold_area == NULL)
  288.                 break;
  289.             domain_area = strdup (hold_area);
  290.             domain_area[strlen (domain_area) - 1] = '\0';
  291.             p = strrchr (domain_area, '\\');
  292.             if (p == NULL)
  293.             {
  294.                 p = strrchr (domain_area, '/');
  295.                 if (p == NULL)
  296.                 {
  297.                     p = strrchr (domain_area, ':');
  298.                     if (p == NULL)
  299.                         p = domain_area;
  300.                 }
  301.             }
  302.             if (p != domain_area)
  303.                 ++p;
  304.  
  305.             domain_loc = p;
  306.             *p = '\0';
  307.             break;
  308.  
  309.         case 27:                /* "DownLoads"    */
  310.             download_path = ctl_slash_string (c);
  311.             break;
  312.  
  313.         case 28:                /* "NetFile"      */
  314.             DEFAULT.sc_Inbound = ctl_slash_string (c);
  315.             break;
  316.  
  317.         case 29:                /* "Init"         */
  318.             modem_init = ctl_string (c);
  319.             break;
  320.  
  321.         case 30:                /* "Busy"         */
  322.             modem_busy = ctl_string (c);
  323.             break;
  324.  
  325.         case 31:                /* "Prefix"       */
  326.             predial = ctl_string (c);
  327.             normprefix = predial;
  328.             break;
  329.  
  330.         case 32:                /* "NodeList"     */
  331.             net_info = ctl_slash_string (c);
  332.             break;
  333.  
  334.         case 33:                /* "Avail"        */
  335.             DEFAULT.rq_FILES = ctl_string (c);
  336.             break;
  337.  
  338.         case 34:                /* "OKFile"       */
  339.             DEFAULT.rq_OKFile = ctl_string (c);
  340.             break;
  341.  
  342.         case 35:                /* "About"        */
  343.             DEFAULT.rq_About = ctl_string (c);
  344.             break;
  345.  
  346.         case 36:                /* "MAILnote"     */
  347.             MAILnote = ctl_string (c);
  348.             break;
  349.  
  350.         case 37:                /* "Banner"       */
  351.             BBSbanner = ctl_string (c);
  352.             break;
  353.  
  354.         case 38:                /* "UnAttended"   */
  355.             un_attended = 1;
  356.             command_line_un = 1;
  357.             break;
  358.  
  359.         case 39:                /* "OverWrite"    */
  360.             overwrite = 1;
  361.             break;
  362.  
  363.         case 40:                /* "Rev3"         */
  364.             rev3 = 1;
  365.             break;
  366.  
  367.         case 41:                /* "ReqOnUs"      */
  368.             on_our_nickel = 1;
  369.             break;
  370.  
  371.         case 42:                /* "LockBaud"     */
  372.             c = skip_blanks (c);/* Skip to baud   */
  373.  
  374.             if (*c == '\0')        /* Case 1: no arg */
  375.             {
  376.                 lock_baud = 1;    /* Always lock    */
  377.                 break;
  378.             }
  379.  
  380.             if (isdigit (*c))    /* Case 2: baud   */
  381.             {
  382.                 lock_baud = atol (c);    /* Lock at >= baud*/
  383.                 break;
  384.             }
  385.  
  386.             i = 1 + strlen (c);    /* Case 3: ARQ    */
  387.             if (ARQs > 16)        /* Only 16 allowed*/
  388.                 break;
  389.             p = calloc (1, i);    /* Allocate space */
  390.             if (p == NULL)        /* Give up if none*/
  391.                 break;
  392.             (void) strcpy (p, c);    /* Copy ARQ string*/
  393.             ARQ[ARQs++] = p;    /* Update array   */
  394.             break;
  395.  
  396.         case 43:                /* "TimeOut"      */
  397.             c = skip_blanks (c);
  398.             BBStimeout = (unsigned) (atoi (c) * 100);
  399.             if (BBStimeout < 2000)
  400.                 BBStimeout = 2000;
  401.             break;
  402.  
  403.         case 44:                /* "NoSLO"        */
  404.             no_overdrive = 1;
  405.             break;
  406.  
  407.         case 45:                /* "SlowModem"    */
  408.             slowmodem = 1;
  409.             break;
  410.  
  411.         case 46:                /* "SmallWindow"  */
  412.             small_window = 1;
  413.             break;
  414.  
  415.         case 47:                /* "NoPickup"     */
  416.             no_pickup = 1;
  417.             break;
  418.  
  419.         case 48:                /* "NoRequests"   */
  420.             no_requests = 1;
  421.             break;
  422.  
  423.         case 49:                /* "NetMail"      */
  424.             c = skip_blanks (c);
  425.             if (*c != '$')
  426.                 netmail = ctl_slash_string (c);
  427.             else
  428.                 netmail = ctl_string (c);
  429.             break;
  430.  
  431.         case 50:                /* "Suffix"       */
  432.             postdial = ctl_string (c);
  433.             normsuffix = postdial;
  434.             break;
  435.  
  436.         case 51:                /* "NoFullScreen" */
  437.             fullscreen = 0;
  438.             break;
  439.  
  440.         case 52:                /* "AutoBaud"     */
  441.             autobaud = 1;
  442.             break;
  443.  
  444.         case 53:                /* "Gong"         */
  445.             gong_allowed = 1;
  446.             break;
  447.  
  448.         case 54:                /* "NoCollide"    */
  449.             no_collide = 1;
  450.             break;
  451.  
  452.         case 55:                /* "TBBSlist"     */
  453. #ifdef OLDTBBSLIST
  454.             nodefunc = TBBSLookup;
  455.             newnodelist = 0;
  456. #endif
  457.             break;
  458.  
  459.         case 56:                /* "TaskView"     */
  460.         case 57:                /* "TopView"      */
  461.             have_tv = 1;
  462.             break;
  463.  
  464.         case 58:                /* "ExtrnMail"    */
  465.             c = skip_blanks (c);
  466.             if (isdigit (*c))
  467.             {
  468.                 lev_ext_mail[num_ext_mail] = atoi (c);
  469.                 while ((*c) && (!isspace (*c)))
  470.                     ++c;
  471.             }
  472.             else
  473.             {
  474.                 lev_ext_mail[num_ext_mail] = 99;
  475.             }
  476.             ext_mail_string[num_ext_mail++] = ctl_string (c);
  477.             break;
  478.  
  479.         case 59:                /* "BBSnote"      */
  480.             BBSnote = ctl_string (c);
  481.             break;
  482.  
  483.         case 60:                /* "BBS"          */
  484.             BBSopt = ctl_string (c);
  485.             break;
  486.  
  487.         case 61:                /* "ScriptPath"   */
  488.             script_path = ctl_slash_string (c);
  489.             break;
  490.  
  491.         case 62:                /* "BoxType"      */
  492.             c = skip_blanks (c);
  493.             boxtype = (short) atoi (c);
  494.             if ((boxtype > 4) || (boxtype < 0))
  495.                 boxtype = 1;
  496.             break;
  497.  
  498.         case 63:                /* "MultiLink"    */
  499.             have_ml = 1;
  500.             break;
  501.  
  502.         case 64:                /* "Include"      */
  503.             c = skip_blanks (c);
  504.             parse_config (c);
  505.             break;
  506.  
  507.         case 65:                /* "CaptureFile"  */
  508.             logptr = ctl_string (c);
  509.             break;
  510.  
  511.         case 66:                /* "CursorCol"    */
  512.             c = skip_blanks (c);
  513.             cursor_col = atoi (c) - 1;
  514.             break;
  515.  
  516.         case 67:                /* "CursorRow"    */
  517.             c = skip_blanks (c);
  518.             cursor_row = atoi (c) - 1;
  519.             break;
  520.  
  521.         case 68:                /* "DoingMail"    */
  522.             c = skip_blanks (c);
  523.             (void) sprintf (junk, "\r\r%s\r\r", c);
  524.             noBBS = calloc (1, strlen (junk) + 1);
  525.             (void) strcpy (noBBS, junk);
  526.             break;
  527.  
  528.         case 69:                /* "EnterBBS"     */
  529.             c = skip_blanks (c);
  530.             (void) sprintf (junk, "\r%s\r", c);
  531.             BBSesc = calloc (1, strlen (junk) + 1);
  532.             (void) strcpy (BBSesc, junk);
  533.             break;
  534.  
  535.         case 70:                /* "PrivateNet"   */
  536.             c = skip_blanks (c);
  537.             pvtnet = atoi (c);
  538.             break;
  539.  
  540.         case 71:                /* "Packer"       */
  541.             packer = ctl_string (c);
  542.             break;
  543.  
  544.         case 72:                /* "Cleanup"      */
  545.             cleanup = ctl_string (c);
  546.             break;
  547.  
  548.         case 73:                /* "AfterMail"    */
  549.             aftermail = ctl_string (c);
  550.             break;
  551.  
  552.         case 74:                /* "Colors"       */
  553.             sscanf (c, "%hd %hd %hd %hd %hd %hd %hd %hd",
  554.                 &colors.background, &colors.settings, &colors.history,
  555.                 &colors.hold, &colors.call, &colors.file,
  556.                 &colors.calling, &colors.popup);
  557.             break;
  558.  
  559.         case 163:                /* "BiDiBaud"     */
  560.         case 75:                /* "JanusBaud"    */
  561.             c = skip_blanks (c);
  562.             janus_baud = atol (c);
  563.             break;
  564.  
  565.         case 76:                /* "ReqTemplate"  */
  566.             DEFAULT.rq_Template = ctl_string (c);
  567.             break;
  568.  
  569.         case 77:                /* "KnownAvail"   */
  570.             KNOWN.rq_FILES = ctl_string (c);
  571.             break;
  572.  
  573.         case 78:                /* "KnownReqList" */
  574.             KNOWN.rq_OKFile = ctl_string (c);
  575.             break;
  576.  
  577.         case 79:                /* "KnownAbout"   */
  578.             KNOWN.rq_About = ctl_string (c);
  579.             break;
  580.  
  581.         case 80:                /* "KnownInbound" */
  582.             KNOWN.sc_Inbound = ctl_slash_string (c);
  583.             break;
  584.  
  585.         case 81:                /* "KnownReqLim"  */
  586.             (void) sscanf (c, "%d %d", &KNOWN.rq_Limit, &KNOWN.rq_Cum_Limit);
  587.             break;
  588.  
  589.         case 82:                /* "KnownReqTpl"  */
  590.             KNOWN.rq_Template = ctl_string (c);
  591.             break;
  592.  
  593.         case 83:                /* "ProtAvail"   */
  594.             PROT.rq_FILES = ctl_string (c);
  595.             break;
  596.  
  597.         case 84:                /* "ProtReqList" */
  598.             PROT.rq_OKFile = ctl_string (c);
  599.             break;
  600.  
  601.         case 85:                /* "ProtAbout"   */
  602.             PROT.rq_About = ctl_string (c);
  603.             break;
  604.  
  605.         case 86:                /* "ProtInbound" */
  606.             PROT.sc_Inbound = ctl_slash_string (c);
  607.             break;
  608.  
  609.         case 87:                /* "ProtReqLim"  */
  610.             (void) sscanf (c, "%d %d", &PROT.rq_Limit, &PROT.rq_Cum_Limit);
  611.             break;
  612.  
  613.         case 88:                /* "ProtReqTpl"  */
  614.             PROT.rq_Template = ctl_string (c);
  615.             break;
  616.  
  617.         case 89:                /* "Application" */
  618.             break;
  619.  
  620.         case 90:                /* "NoZones"     */
  621.             no_EMSI++;        /* no zones means no EMSI */
  622.             no_zones = 1;
  623.             break;
  624.  
  625.         case 91:                /* "Answer"        */
  626.             ans_str = ctl_string (c);
  627.             break;
  628.  
  629.         case 92:                /* "PollTries"   */
  630.             c = skip_blanks (c);
  631.             poll_tries = atoi (c);
  632.             break;
  633.  
  634.         case 93:                /* "SwapDir"     */
  635.             c = skip_blanks (c);
  636.             i = (int) strlen (c);
  637.             swapdir = calloc (1, i + 2);
  638.             (void) strcpy (swapdir, c);
  639.             (void) add_backslash (swapdir);
  640.             break;
  641.  
  642.         case 95:                /* "Curmudgeon"  */
  643.             ++curmudgeon;        /* Do it like Randy */
  644.             break;
  645.  
  646.         case 96:                /* "NoWaZOO"     */
  647.             ++no_WaZOO;            /* FTSC sessions */
  648.             break;
  649.  
  650.         case 97:                /* "ScreenBlank" */
  651.             do_screen_blank = 1;
  652.             p = skip_blanks (c);
  653.             if (strnicmp (p, MSG_TXT (M_KEY), 3) == 0)
  654.             {
  655.                 blank_on_key = 1;
  656.             }
  657.             else if (strnicmp (p, MSG_TXT (M_CALL), 4) == 0)
  658.             {
  659.                 blank_on_key = 0;
  660.             }
  661.             break;
  662.  
  663.         case 98:                /* "Mark_Kromm"  */
  664.  
  665.             /* These colors from Mark Kromm, Fidonet 1:261/1034  */
  666.  
  667.             colors.background = 112;    /* The           */
  668.             colors.settings = 9;/* Great         */
  669.             colors.history = 10;/* BinkleyTerm   */
  670.             colors.hold = 11;    /* Colors        */
  671.             colors.call = 14;    /* Contest       */
  672.             colors.file = 12;    /* Winner!!!!    */
  673.             colors.calling = 56;
  674.             colors.popup = 15;
  675.             break;
  676.  
  677.         case 99:                /* "Server"      */
  678.             server_mode = 1;
  679.             break;
  680.  
  681.         case 100:                /* "ModemTrans"  */
  682.             cfg_mdm_trans (c);
  683.             break;
  684.  
  685.         case 101:                /* "PreDial" */
  686.             dial_setup = ctl_string (c);
  687.             break;
  688.  
  689.         case 102:                /* "PreInit" */
  690.             init_setup = ctl_string (c);
  691.             break;
  692.  
  693.         case 103:                /* "DTRHigh" */
  694.             leave_dtr_high = 1;
  695.             break;
  696.  
  697.         case 104:                /* "Debug" */
  698.             debugging_log = !debugging_log;
  699.             break;
  700.  
  701.         case 105:                /* "NoZedZap" */
  702.             no_zapzed = !no_zapzed;
  703.             break;
  704.  
  705.         case 106:                /* "NoResync" */
  706.             no_resync = !no_resync;
  707.             break;
  708.  
  709.         case 107:                /* "NoSEAlink" */
  710.             no_sealink = !no_sealink;
  711.             break;
  712.  
  713.         case 108:                /* "FTS-0001" */
  714.             no_sealink = 1;
  715.             no_resync = 1;
  716.             no_overdrive = 1;
  717.             ++no_WaZOO;            /* FTSC sessions  */
  718.             ++no_EMSI;
  719.             break;
  720.  
  721.         case 109:                /* "LineUpdate"   */
  722.             immed_update = !immed_update;
  723.             break;
  724.  
  725.         case 162:                /* "BiDiOK"       */
  726.         case 110:                /* "JanusOK"      */
  727.             cfg_Janus (c);
  728.             break;
  729.  
  730.         case 111:                /* "TermInit"     */
  731.             term_init = ctl_string (c);
  732.             break;
  733.  
  734.         case 112:                /* "DomainKludge" */
  735.             cfg_domain_kludge (c);
  736.             break;
  737.  
  738.         case 113:                /* "Snoop"        */
  739. #ifdef Snoop
  740.             if (getenv ("SNOOPPIPE") == NULL)
  741.             {
  742.                 strcpy (pipename, skip_blanks (c));
  743.                 if (pipename[0] != '\0')
  744.                     snoop_open (pipename);
  745.             }
  746. #endif                            /* Snoop */
  747.             break;
  748.  
  749.         case 114:                /* "Flags"        */
  750.             flag_dir = ctl_slash_string (c);
  751.             break;
  752.  
  753.         case 115:                /* "Tasknumber"   */
  754.             c = skip_blanks (c);
  755.             TaskNumber = atoi (c) & 0xFF;
  756.             break;
  757.  
  758.         case 116:                /* "MaxBytes"     */
  759.             (void) sscanf (c, "%ld %ld", &DEFAULT.byte_Limit, &DEFAULT.byte_Cum_Limit);
  760.             break;
  761.  
  762.         case 117:                /* "KnownMaxBytes"*/
  763.             (void) sscanf (c, "%ld %ld", &KNOWN.byte_Limit, &KNOWN.byte_Cum_Limit);
  764.             break;
  765.  
  766.         case 118:                /* "ProtMaxBytes" */
  767.             (void) sscanf (c, "%ld %ld", &PROT.byte_Limit, &PROT.byte_Cum_Limit);
  768.             break;
  769.  
  770.         case 119:                /* "StartBlkLen"  */
  771.             c = skip_blanks (c);
  772.             fstblklen = atoi (c);
  773.             if ((fstblklen < 64) || (fstblklen > 2048))
  774.                 fstblklen = 1024;
  775.             break;
  776.  
  777.         case 120:                /* "MaxTime"      */
  778.             (void) sscanf (c, "%d %ld", &DEFAULT.time_Limit, &DEFAULT.time_Cum_Limit);
  779.             DEFAULT.time_Limit *= 60;
  780.             DEFAULT.time_Cum_Limit *= 60;
  781.             break;
  782.  
  783.         case 121:                /* "KnownMaxTime" */
  784.             (void) sscanf (c, "%d %ld", &KNOWN.time_Limit, &KNOWN.time_Cum_Limit);
  785.             KNOWN.time_Limit *= 60;
  786.             KNOWN.time_Cum_Limit *= 60;
  787.             break;
  788.  
  789.         case 122:                /* "ProtMaxTime"  */
  790.             (void) sscanf (c, "%d %ld", &PROT.time_Limit, &PROT.time_Cum_Limit);
  791.             PROT.time_Limit *= 60;
  792.             PROT.time_Cum_Limit *= 60;
  793.             break;
  794.  
  795.         case 123:                /* "RingTries"    */
  796.             c = skip_blanks (c);
  797.             ring_tries = atoi (c);
  798.             break;
  799.  
  800.         case 124:                /* "NoSharing"    */
  801.             no_sharing = 1;
  802.             break;
  803.  
  804.         case 125:                /* "Version7"     */
  805.             version7 = 1;
  806.             nodefunc = ver7find;
  807.             userfunc = opususer;
  808.             newnodelist = 0;
  809.             break;
  810.  
  811.         case 126:                /* "BlankWait"    */
  812.             c = skip_blanks (c);
  813.             blank_time = (unsigned int) 100 *(unsigned int) atoi (c);
  814.  
  815.             break;
  816.  
  817.         case 127:                /* "Serial"       */
  818.             c = skip_blanks (c);
  819.             if (isdigit (*c))
  820.                 serial = atoi (c);
  821.             break;
  822.  
  823.         case 128:                /* "NoDietIfna"   */
  824.             no_dietifna = 1;
  825.             break;
  826.  
  827.         case 130:
  828.             winslice = 1;        /* "WinSlice"     */
  829.             break;
  830.  
  831.         case 131:                /* "NoSize"       */
  832.             no_size = 1;
  833.             break;
  834.  
  835.         case 132:                /* "ForcExit" */
  836.             c = skip_blanks (c);
  837.             forcexit = atoi (c);
  838.             break;
  839.  
  840.         case 133:                /* "Extern" */
  841.             c = skip_blanks (c);
  842.             EXTopt = ctl_string (c);
  843.             break;
  844.  
  845.         case 134:                /* "NoEMSI"       */
  846.             no_EMSI = ++no_EMSI;
  847.             break;
  848.  
  849.         case 135:                /* "MyLocation"   */
  850.             location = ctl_string (c);
  851.             break;
  852.  
  853.         case 136:                /* "MyPhone"      */
  854.             myphone = ctl_string (c);
  855.             break;
  856.  
  857.         case 137:                /* "MyListFlags"  */
  858.             myflags = ctl_string (c);
  859.             break;
  860.  
  861.         case 138:                /* "MyMaxbaud"    */
  862.             mymaxbaud = ctl_string (c);
  863.             break;
  864.  
  865.         case 139:                /* "PickupALL"    */
  866.             pickup_all = 1;
  867.             break;
  868.  
  869.         case 140:                /* "FileSec"      */
  870.             (void) sscanf (c, "%d", &DEFAULT.security);
  871.             break;
  872.  
  873.         case 141:                /* "KnownSec"     */
  874.             (void) sscanf (c, "%d", &KNOWN.security);
  875.             break;
  876.  
  877.         case 142:                /* "ProtSec"      */
  878.             (void) sscanf (c, "%d", &PROT.security);
  879.             break;
  880.  
  881.         case 143:                /* "MaxAreas"     */
  882.             max_areadat = ctl_string (c);
  883.             break;
  884.  
  885.         case 144:                /* "Domain"       */
  886.             cfg_domain (c);
  887.             break;
  888.  
  889.         case 145:                /* "MailSound"    */
  890. #ifdef BINKLEY_SOUNDS
  891.             fnMailSound = cfg_sound (c);
  892. #endif
  893.             break;
  894.  
  895.         case 146:                /* "FileSound"    */
  896. #ifdef BINKLEY_SOUNDS
  897.             fnFileSound = cfg_sound (c);
  898. #endif
  899.             break;
  900.  
  901.         case 147:                /* "BBSSound"     */
  902. #ifdef BINKLEY_SOUNDS
  903.             fnBBSSound = cfg_sound (c);
  904. #endif
  905.             break;
  906.  
  907.         case 148:                /* "EXTSound"     */
  908. #ifdef BINKLEY_SOUNDS
  909.             fnEXTSound = cfg_sound (c);
  910. #endif
  911.             break;
  912.  
  913.         case 149:                /* "StartSound"   */
  914. #ifdef BINKLEY_SOUNDS
  915.             fnStartSound = cfg_sound (c);
  916. #endif
  917.             break;
  918.  
  919.         case 150:                /* "FaxSound"     */
  920. #ifdef BINKLEY_SOUNDS
  921.             fnFAXSound = cfg_sound (c);
  922. #endif
  923.             break;
  924.  
  925.         case 151:                /* "FaxInDir"     */
  926.             fax_in = ctl_slash_string (c);
  927.             break;
  928.  
  929.         case 152:                /* "ModemFailure" */
  930.             i = FAILURE;
  931.             goto add_mdm_response;
  932.  
  933.         case 153:                /* "ModemIgnore"  */
  934.             i = IGNORE;
  935.             goto add_mdm_response;
  936.  
  937.         case 154:                /* "ModemConnect" */
  938.             i = CONNECTED;
  939.             goto add_mdm_response;
  940.  
  941.         case 155:                /* "ModemRinging" */
  942.             i = RINGING;
  943.             goto add_mdm_response;
  944.  
  945.         case 156:                /* "ModemIncoming"*/
  946.             i = INCOMING;
  947.             goto add_mdm_response;
  948.  
  949.         case 157:                /* "ModemFax"     */
  950.             i = FAX;
  951.             /* goto add_mdm_response; */
  952.  
  953. add_mdm_response:
  954.  
  955.             /* If we have no space, bump the array */
  956.             if (resp_count == max_resp_count)
  957.             {
  958.                 int new_max = max_resp_count + 32;
  959.                 int new_size = new_max * sizeof (struct resp_str);
  960.                 struct resp_str *new_resps;
  961.  
  962.                 new_resps = (struct resp_str *) realloc (mdm_resps, new_size);
  963.                 if (new_resps == NULL)
  964.                     break;
  965.                 max_resp_count = new_max;
  966.                 mdm_resps = new_resps;
  967.             }
  968.             mdm_resps [resp_count].resp = ctl_string (c);
  969.             mdm_resps [resp_count++].disp = i;
  970.             break;
  971.  
  972.         case 158:                /* "CostLog"    */
  973.             cost_log_name = ctl_string (c);
  974.             if ((cost_log = share_fopen (cost_log_name, append_ascii, DENY_WRITE)) == NULL)
  975.             {
  976.                 free (cost_log_name);
  977.                 cost_log_name = NULL;
  978.             }
  979.             break;
  980.  
  981.         case 159:                /* "CostUnit"   */
  982.             c = skip_blanks (c);
  983.             if (isdigit (*c))
  984.                 cost_unit = atoi (c);
  985.             break;
  986.  
  987.         case 160:                /* "EuroCost"   */
  988.             eurocost = 1;
  989.             break;
  990.  
  991.         case 161:                /* "NoFilter"   */
  992.  
  993.             c = skip_blanks (c);
  994.             if (!*c)
  995.                 goto bad_line;
  996.  
  997.             if (cMNP > 16)        /* Only 16 allowed */
  998.                 break;
  999.  
  1000.             /*    Allocate space to copy the result code */
  1001.  
  1002.             i = 1 + strlen (c);
  1003.             p = calloc (1, i);
  1004.             if (p == NULL)
  1005.                 break;
  1006.  
  1007.             /*     Copy the result code and store the pointer */
  1008.  
  1009.             (void) strcpy (p, c);
  1010.             pchMNP[cMNP++] = p;
  1011.             break;
  1012.  
  1013.         case 164:                /* "NoHydra"    */
  1014.             no_hydra = 1;
  1015.             break;
  1016.  
  1017.         case 165:                /* "NoJanus"    */
  1018.             no_janus = 1;
  1019.             break;
  1020.  
  1021.         case 166:                /* "ExtBaudRates"    */
  1022. #ifdef EXTENDED_BAUDRATES
  1023.             extend_rates = 1;
  1024.             pbtypes = exttypes;
  1025. #endif
  1026.             break;
  1027.  
  1028.         case 167:                /* "AfterCall" *//* MB 93-12-12  AFTERCALL */
  1029.             c = skip_blanks (c);
  1030.             if (isdigit (*c))
  1031.             {
  1032.                 lines_aftercall = atoi (c);
  1033.                 c = skip_to_blank (c);
  1034.             }
  1035.             modem_aftercall = ctl_string (c);
  1036.             break;
  1037.  
  1038.         case 168:                /* "PktRsp"      *//* MB 93-12-12  PKTRSP */
  1039.             pktrsp = 1;
  1040.             break;
  1041.  
  1042.         case 169:                /* "ExtSession" */
  1043.             c = skip_blanks (c);
  1044.             if (!isxdigit (*c))
  1045.                 goto bad_line;
  1046.  
  1047.             sscanf (c, "%x", &i);
  1048.             ExtMailMask = (word) i;
  1049.             if (!ExtMailMask)
  1050.                 goto bad_line;
  1051.  
  1052.             c = skip_to_blank (c);
  1053.             ExtMailAgent = ctl_string (c);
  1054.             break;
  1055.             
  1056.         case 170:                /* "FaxBaud"    */
  1057.             ltemp = atol (c);
  1058.             fax_baud = -1;
  1059.             for (i = 0; pbtypes[i].rate_value; i++)
  1060.             {
  1061.                 if (pbtypes[i].rate_value == (unsigned long)ltemp)
  1062.                 {
  1063.                     fax_baud = i;
  1064.                     break;
  1065.                 }
  1066.             }
  1067.             if (fax_baud == -1)
  1068.                 goto bad_line;
  1069.             break;
  1070.  
  1071.         case 171:                /* "ErrLevelShell" */
  1072.             c = skip_blanks (c);
  1073.             i = atoi (c);
  1074.             if ((i <= 0) || (i > 255))
  1075.             {
  1076.                 (void) printf (MSG_TXT (M_BAD_ERRLEVELSHELLNUM), i);
  1077.                 break;
  1078.             }
  1079.             c = skip_to_blank (c);
  1080.             c = skip_blanks (c);
  1081.             if (c)
  1082.             {
  1083.                 strupr (c);
  1084.                 errlvlshell[i-1] = ctl_string (c);
  1085.             }
  1086.             break;
  1087.  
  1088.         case 172:                /* AltNumber */
  1089.             cfg_alt_num (c);
  1090.             break;
  1091.  
  1092.         case 173:                /* ModemRetry */
  1093.             i = DIALRETRY;
  1094.             goto add_mdm_response;
  1095.  
  1096.  
  1097.         case 174:                /* RecentActivityLines */
  1098.             c = skip_to_blank (c);
  1099.             c = skip_blanks (c);
  1100.             i = atoi (c) ;
  1101.  
  1102.             if (i > 0) 
  1103.                 scrllines = i;
  1104.             break;
  1105.  
  1106.         case 175:                /* "RingWait"    */
  1107.             c = skip_blanks (c);
  1108.             ring_wait = atoi (c);
  1109.             break;
  1110.  
  1111.         case 176:                /* "WinFOSSIL"   */
  1112. #ifdef _WIN32
  1113.             use_winfossil = 1;
  1114. #endif
  1115.             break;
  1116.  
  1117.         default:
  1118. bad_line:
  1119.             (void) printf (MSG_TXT (M_UNKNOWN_LINE), temp);
  1120.         }
  1121.     }
  1122.     (void) fclose (stream);        /* close input file */
  1123.  
  1124.     if (debugging_log)
  1125.         loglevel = 6;
  1126. }
  1127.  
  1128. char *
  1129. ctl_string (char *source)        /* malloc & copy to ctl      */
  1130. {
  1131.     char *dest, *c;
  1132.     int i;
  1133.  
  1134.     c = skip_blanks (source);    /* get over the blanks       */
  1135.     i = (int) strlen (c);        /* get length of remainder   */
  1136.     if (i < 1)                    /* must have at least 1      */
  1137.         return (NULL);            /* if not, return NULL       */
  1138.     dest = calloc (1, (unsigned int) (++i));    /* allocate space for string */
  1139.     if (dest == NULL)            /* If we failed to get it,   */
  1140.         return (NULL);            /* Just return NULL          */
  1141.     (void) strcpy (dest, c);    /* copy the stuff over       */
  1142.     return (dest);                /* and return the address    */
  1143. }
  1144.  
  1145. char *
  1146. ctl_slash_string (char *source)    /* malloc & copy to ctl      */
  1147. {
  1148.     char *dest, *c;
  1149.     int i;
  1150.     struct stat buffer;
  1151.  
  1152.     c = skip_blanks (source);    /* get over the blanks       */
  1153.     i = (int) strlen (c);        /* get length of remainder   */
  1154.     if (i < 1)                    /* must have at least 1      */
  1155.         return (NULL);            /* if not, return NULL       */
  1156.     dest = calloc (1, (unsigned int) (i + 2));    /* allocate space for string */
  1157.     if (dest == NULL)            /* If we failed to get it,   */
  1158.         return (NULL);            /* Just return NULL          */
  1159.     (void) strcpy (dest, c);    /* copy the stuff over       */
  1160.     (void) delete_backslash (dest);    /* get rid of trailing stuff */
  1161.     /* Check to see if the directory exists */
  1162.     i = stat (dest, &buffer);
  1163.     if (i || (!(buffer.st_mode & S_IFDIR)))
  1164.     {
  1165.         (void) printf (MSG_TXT (M_BAD_DIR), dest);
  1166.         (void) printf (MSG_TXT (M_FAIL_EXEC));
  1167.         free (dest);
  1168.         return (NULL);
  1169.     }
  1170.     (void) add_backslash (dest);/* add the backslash         */
  1171.     return (dest);                /* return the directory name */
  1172. }
  1173.  
  1174. char *
  1175. add_backslash (char *str)
  1176. {
  1177.     char *p;
  1178.  
  1179.     p = str + strlen (str) - 1;
  1180.  
  1181.     if (p >= str)
  1182.     {
  1183.         /* Strip off the trailing blanks */
  1184.         while ((p >= str) && (isspace (*p)))
  1185.         {
  1186.             *p = '\0';
  1187.             --p;
  1188.         }
  1189.  
  1190.         /* Put a backslash if there isn't one */
  1191.         if ((p >= str) && (*p != '\\') && (*p != '/'))
  1192.         {
  1193.             *(++p) = '\\';
  1194.             *(++p) = '\0';
  1195.         }
  1196.     }
  1197.  
  1198.     return (fancy_str (str));
  1199. }
  1200.  
  1201. char *
  1202. delete_backslash (char *str)
  1203. {
  1204.     char *p;
  1205.  
  1206.     p = str + strlen (str) - 1;
  1207.  
  1208.     if (p >= str)
  1209.     {
  1210.         /* Strip off the trailing blanks */
  1211.         while ((p >= str) && (isspace (*p)))
  1212.         {
  1213.             *p = '\0';
  1214.             --p;
  1215.         }
  1216.  
  1217.         /* Get rid of backslash if there is one */
  1218.         if ((p >= str) && ((*p == '\\') || (*p == '/')))
  1219.         {
  1220.             if ((p > str) && (*(p - 1) != ':'))    /* Don't delete on root */
  1221.                 *p = '\0';
  1222.         }
  1223.     }
  1224.  
  1225.     return (fancy_str (str));
  1226. }
  1227.  
  1228. #ifdef BINKLEY_SOUNDS
  1229. char *
  1230. cfg_sound (char *source)        /* malloc & copy to ctl      */
  1231. {
  1232.     char *dest, *c;
  1233.     int i;
  1234.  
  1235.     c = skip_blanks (source);    /* get over the blanks       */
  1236.     i = (int) strlen (c);        /* get length of remainder   */
  1237.     if (i < 1)                    /* must have at least 1      */
  1238.         return (NULL);            /* if not, return NULL       */
  1239.     if (!dexists (c))            /* Is the file there?        */
  1240.         return (NULL);            /* No, return NULL           */
  1241.     dest = calloc (1, (unsigned int) (i + 1));    /* allocate space for string */
  1242.     if (dest == NULL)            /* If we failed to get it,   */
  1243.         return (NULL);            /* Just return NULL          */
  1244.     (void) strcpy (dest, c);    /* copy the stuff over       */
  1245.     return (dest);                /* return the directory name */
  1246. }
  1247. #endif
  1248.  
  1249. void
  1250. cfg_macro (char *c)
  1251. {
  1252.     int i;
  1253.     char *p;
  1254.  
  1255.     c = skip_blanks (c);
  1256.     i = atoi (c);
  1257.     if ((i <= 0) || (i > 9))
  1258.     {
  1259.         (void) printf ("%s %d %s\n", MSG_TXT (M_MACRO_NUMBER), i, MSG_TXT (M_OUT_OF_RANGE));
  1260.         return;
  1261.     }
  1262.     c = skip_to_blank (c);
  1263.     c = skip_blanks (c);
  1264.     keys[i - 1] = calloc (1, strlen (c) + 1);
  1265.     p = keys[i - 1];
  1266.     while (*c && (*c != '\n'))
  1267.     {
  1268.         if (*c == '|')
  1269.             *p++ = '\r';
  1270.         else
  1271.             *p++ = *c;
  1272.         ++c;
  1273.     }
  1274.     *p = '\0';
  1275. }
  1276.  
  1277. void
  1278. cfg_dial_string (char *c)
  1279. {
  1280.     char *p, *p1;
  1281.     PN_TRNS *tpn;
  1282.  
  1283.     p = c;
  1284.     while ((*p) && (isspace (*p)))
  1285.         ++p;
  1286.  
  1287.     if ((*p == ';') || (*p == '\0'))
  1288.     {
  1289.         return;
  1290.     }
  1291.  
  1292.     tpn = (PN_TRNS *) calloc (1, sizeof (PN_TRNS));
  1293.  
  1294.     p1 = tpn->num;
  1295.     while ((*p) && (!isspace (*p)))
  1296.     {
  1297.         *p1++ = *p++;
  1298.     }
  1299.     *p1 = '\0';
  1300.  
  1301.     while ((*p) && (isspace (*p)))
  1302.     {
  1303.         ++p;
  1304.     }
  1305.  
  1306.     p1 = tpn->pre;
  1307.     while ((*p) && (*p != '/') && (!isspace (*p)))
  1308.     {
  1309.         *p1++ = *p++;
  1310.     }
  1311.     *p1 = '\0';
  1312.  
  1313.     p1 = tpn->suf;
  1314.     if ((*p == '\0') || (isspace (*p)))
  1315.     {
  1316.         *p1 = '\0';
  1317.     }
  1318.     else
  1319.     {
  1320.         ++p;
  1321.  
  1322.         while ((*p) && (!isspace (*p)))
  1323.         {
  1324.             *p1++ = *p++;
  1325.         }
  1326.         *p1 = '\0';
  1327.     }
  1328.  
  1329.     tpn->len = (short) strlen (tpn->num);
  1330.     tpn->next = NULL;
  1331.     if (pn_head == NULL)
  1332.     {
  1333.         pn_head = tpn;
  1334.     }
  1335.     else
  1336.     {
  1337.         pn->next = tpn;
  1338.     }
  1339.     pn = tpn;
  1340. }
  1341.  
  1342. void
  1343. cfg_mdm_trans (char *c)
  1344. {
  1345.     char *p, *p1;
  1346.     MDM_TRNS *tmm;
  1347.  
  1348.     p = c;
  1349.     while ((*p) && (isspace (*p)))
  1350.         ++p;
  1351.  
  1352.     if ((*p == ';') || (*p == '\0'))
  1353.     {
  1354.         return;
  1355.     }
  1356.  
  1357.     tmm = (MDM_TRNS *) calloc (1, sizeof (MDM_TRNS));
  1358.  
  1359.     tmm->mdm = (byte) atoi (p);
  1360.     while ((*p) && (!isspace (*p)))
  1361.     {
  1362.         p++;
  1363.     }
  1364.  
  1365.     while ((*p) && (isspace (*p)))
  1366.     {
  1367.         ++p;
  1368.     }
  1369.  
  1370.     p1 = tmm->pre;
  1371.     while ((*p) && (*p != '/') && (!isspace (*p)))
  1372.     {
  1373.         *p1++ = *p++;
  1374.     }
  1375.     *p1 = '\0';
  1376.  
  1377.     p1 = tmm->suf;
  1378.     if ((*p == '\0') || (isspace (*p)))
  1379.     {
  1380.         *p1 = '\0';
  1381.     }
  1382.     else
  1383.     {
  1384.         ++p;
  1385.  
  1386.         while ((*p) && (!isspace (*p)))
  1387.         {
  1388.             *p1++ = *p++;
  1389.         }
  1390.         *p1 = '\0';
  1391.     }
  1392.  
  1393.     tmm->next = NULL;
  1394.     if (mm_head == NULL)
  1395.     {
  1396.         mm_head = tmm;
  1397.     }
  1398.     else
  1399.     {
  1400.         mm->next = tmm;
  1401.     }
  1402.     mm = tmm;
  1403. }
  1404.  
  1405. void
  1406. cfg_domain (char *c)
  1407. {
  1408.     char *p, *p1, *p2;
  1409.     int i;
  1410.  
  1411.     p = skip_blanks (c);
  1412.     p = strtok (p, "; \t\r\n");
  1413.     if (p != NULL)
  1414.     {
  1415.         /* Have the domain name, now get the abbreviated name */
  1416.         p2 = strtok (NULL, "; \t\r\n");
  1417.         if (strlen (p2) > 8)
  1418.             *(p2 + 8) = '\0';
  1419.         if (p2 != NULL)
  1420.         {
  1421.             /* Have the domain name and abbreviated, now get the list name */
  1422.             p1 = strtok (NULL, "; \t\r\n");
  1423.             if (p1 == NULL)
  1424.                 p1 = p2;
  1425.  
  1426.             /* Have the list name and the domain name, now use them */
  1427.             for (i = 0; domain_name[i] != NULL; i++)
  1428.             {
  1429.                 if (strnicmp (domain_name[i], p, strlen (domain_name[i])) == 0)
  1430.                 {
  1431.                     domain_nodelist[i] = strdup (p1);
  1432.                     domain_abbrev[i] = strdup (p2);
  1433.                     break;
  1434.                 }
  1435.             }
  1436.             if ((domain_name[i] == NULL) && (i < 49))
  1437.             {
  1438.                 domain_name[i] = strdup (p);
  1439.                 domain_abbrev[i] = strdup (p2);
  1440.                 domain_nodelist[i] = strdup (p1);
  1441.             }
  1442.         }
  1443.     }
  1444. }
  1445.  
  1446. void
  1447. cfg_domain_kludge (char *c)
  1448. {
  1449.     char *p;
  1450.     word i;
  1451.  
  1452.     p = c;
  1453.     while ((*p) && (isspace (*p)))
  1454.         ++p;
  1455.     if (isdigit (*p))
  1456.     {
  1457.         if (num_domain_kludge == size_domain_kludge)
  1458.         {
  1459.             size_domain_kludge += 16;
  1460.             if (!num_domain_kludge)
  1461.                 domainkludge = (DOMAINKLUDGE *) malloc (size_domain_kludge * sizeof (DOMAINKLUDGE));
  1462.             else
  1463.                 domainkludge = (DOMAINKLUDGE *) realloc ((void *) domainkludge, size_domain_kludge * sizeof (DOMAINKLUDGE));
  1464.         }
  1465.         domainkludge[num_domain_kludge].zone = (word) atoi (p);
  1466.         while ((*p) && (!isspace (*p)))
  1467.             ++p;
  1468.     }
  1469.     else
  1470.         return;
  1471.  
  1472.     p = skip_blanks (p);
  1473.     p = strtok (p, "; \t\r\n");
  1474.     if (p != NULL)
  1475.     {
  1476.         for (i = 0; domain_name[i] != NULL; i++)
  1477.         {
  1478.             if (strnicmp (domain_name[i], p, strlen (domain_name[i])) == 0)
  1479.             {
  1480.                 domainkludge[num_domain_kludge++].domain = i;
  1481.                 break;
  1482.             }
  1483.         }
  1484.     }
  1485.     return;
  1486. }
  1487.  
  1488. void
  1489. cfg_Janus (char *c)
  1490. {
  1491.     J_TYPES *tjt;
  1492.     char *p, *p1;
  1493.  
  1494.     p = c;
  1495.     while ((*p) && (isspace (*p)))
  1496.         ++p;
  1497.  
  1498.     if ((*p == ';') || (*p == '\0'))
  1499.     {
  1500.         return;
  1501.     }
  1502.  
  1503.     tjt = (J_TYPES *) calloc (1, sizeof (J_TYPES));
  1504.  
  1505.     p1 = tjt->j_match;
  1506.     while ((*p) && (!isspace (*p)))
  1507.     {
  1508.         *p1++ = *p++;
  1509.     }
  1510.     *p1 = '\0';
  1511.  
  1512.     tjt->next = NULL;
  1513.  
  1514.     if (j_top == NULL)
  1515.     {
  1516.         j_top = tjt;
  1517.     }
  1518.     else
  1519.     {
  1520.         j_next->next = tjt;
  1521.     }
  1522.     j_next = tjt;
  1523. }
  1524.  
  1525. void
  1526. cfg_alt_num (char *c)
  1527. {
  1528.     char *n1, *n2, *p;
  1529.     P_ANUMS a1, a2;
  1530.  
  1531.     /* Primary starts at first non-blank, ends at blank */
  1532.  
  1533.     c = skip_blanks (c);
  1534.     p = skip_to_blank (c);
  1535.     *p++ = '\0';
  1536.  
  1537.     n1 = ctl_string (c);
  1538.     if (n1 == NULL)
  1539.     {
  1540.         printf (MSG_TXT (M_ALTNUM_NO_PRIMARY));
  1541.         return;
  1542.     }
  1543.  
  1544.     c = skip_blanks (p);
  1545.     n2 = ctl_string (c);
  1546.     if (n2 == NULL)
  1547.     {
  1548.         printf (MSG_TXT (M_ALTNUM_NO_ALTERNATE));
  1549.         free (n1);
  1550.         return;
  1551.     }
  1552.  
  1553.     a1 = calloc (1, sizeof(ANUMS));
  1554.  
  1555.     a1->num = n1;
  1556.     a1->alt = n2;
  1557.  
  1558.     if (anum_head == NULL)
  1559.     {
  1560.         anum_head = a1;
  1561.         return;
  1562.     }
  1563.     else
  1564.     { 
  1565.         /* we need to maintain the order they were entered */
  1566.  
  1567.         a2 = anum_head;
  1568.         while (a2->next != NULL)
  1569.             a2 = a2->next;
  1570.         a2->next = a1;
  1571.     }
  1572. }
  1573.  
  1574.